package domain

import (
	"fmt"
	"gitee.com/liumou_site/gf"
	"gitee.com/liumou_site/logger"
	"gitee.com/liumou_site/tencent-cloud-ssl-automatic/module/AppStruct"
	"gitee.com/liumou_site/tencent-cloud-ssl-automatic/module/tf"
	"github.com/BurntSushi/toml"
)

// ReadDomainTomlAll 读取指定路径下所有Toml文件中的域名配置信息。
//
// 参数 p: Toml文件所在的文件夹路径。
//
// 返回值: []module.DomainConfig，包含所有域名配置信息的切片。
//
// 该函数首先获取指定路径下所有的Toml文件列表，然后逐个读取每个文件的域名配置信息，
// 并将这些信息以切片的形式返回。如果在读取过程中遇到错误，将会被忽略。
func ReadDomainTomlAll(p string) []AppStruct.DomainConfig {
	// 初始化一个空的DomainConfig切片，用于存储所有域名配置信息。
	var res []AppStruct.DomainConfig

	// 获取指定路径下所有的Toml文件列表。
	fileList, _ := tf.GetTomlFileList(p)

	// 遍历文件列表，读取每个文件的域名配置信息。
	for _, v := range fileList {
		logger.Debug("正在读取配置文件: ", v)
		// 读取单个Toml文件的域名配置信息。
		DomainConfig, _ := ReadTomlFileDomainConfig(v)

		// 将读取到的域名配置信息添加到结果切片中。
		res = append(res, DomainConfig)
	}
	if len(res) == 0 {
		logger.Error("没有找到配置文件")
		return nil
	}
	// 返回包含所有域名配置信息的切片。
	return res
}

// ReadTomlFileDomainConfig 读取 TOML 格式的域名配置文件。
// 该函数接受一个文件路径作为参数，尝试解析该文件，并将配置信息填充到 module.DomainConfig 结构中返回。
// 如果文件读取或解析过程中出现任何错误，将返回一个空的 module.DomainConfig 实例和错误信息。
func ReadTomlFileDomainConfig(file string) (AppStruct.DomainConfig, error) {
	// 读取之前判断文件是否存在
	f := gf.NewFile(file)
	f.IsFile()
	if !f.IsFiles {
		logger.Error("配置文件不存在: ", file)
		return AppStruct.DomainConfig{}, fmt.Errorf("配置文件不存在: %s", file)
	}
	// 初始化一个空的 DomainConfig 实例，用于存储解析后的配置信息。
	var dc AppStruct.DomainConfig

	// 使用 tf.DecodeFile 函数读取并解析 TOML 文件，将结果存储在 &dc 指向的 DomainConfig 实例中。
	// 如果解析过程中出现错误，直接返回一个空的 DomainConfig 实例和错误信息。
	_, err := toml.DecodeFile(file, &dc)
	if err != nil {
		return AppStruct.DomainConfig{}, err
	}

	// 如果配置文件成功读取和解析，记录相应的日志信息。
	logger.Info("配置文件读取成功: ", file)

	// 示例性地展示配置信息的访问方式，这里访问了 "pd" 域名配置的 Enable 字段。
	//logger.Info(dc.Enable)
	if dc.Enable {
		logger.Info("域名配置已启用: ", dc.DomainName)
	} else {
		logger.Info("域名配置未启用: ", dc.DomainName)
		return dc, fmt.Errorf("域名配置未启用: %s", dc.DomainName)
	}

	// 最后，将解析后的配置信息返回给调用者。
	return dc, nil
}
